/**
 * 文件名：@CareViewHandlerExceptionResolver.java <br/>
 * 包名：cn.efunbox.afw.web.mvc.springmvc <br/>
 * 项目名：afw-mvc-web <br/>
 * @author xtwin <br/>
 */
package cn.efunbox.afw.web.mvc.springmvc;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView;

import cn.efunbox.afw.core.AfwContext;
import cn.efunbox.afw.core.exception.handler.ExceptionProcessor;
import cn.efunbox.afw.core.mvc.context.Context;
import cn.efunbox.afw.core.resolver.Resolver;

/**
 * 类名：CareViewHandlerExceptionResolver  <br />
 *
 * 功能：和视图相关的异常解析器
 *
 * @author xtwin <br />
 * 创建时间：2015年12月4日 下午12:00:05  <br />
 * @version 2015年12月4日
 */
public class CareViewHandlerExceptionResolver implements HandlerExceptionResolver {
	
	// 日志记录器
	private static final Log logger = LogFactory.getLog(CareViewHandlerExceptionResolver.class);
	
	// 默认视图
	protected String view;
	
	// 异常处理器解析器
	protected Resolver<ExceptionProcessor> exceptionProcessorResover;

	/**
	 * 功能: <br/>
	 * 
	 * 重写：xtwin <br/>
	 * 
	 * @version ：2015年12月4日 下午12:00:51<br/>
	 * 
	 * @param request
	 * @param response
	 * @param handler
	 * @param ex
	 * @return <br/>
	 * @see org.springframework.web.servlet.HandlerExceptionResolver#resolveException(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse, java.lang.Object, java.lang.Exception)
	 */
	@Override
	public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
		
		Context context = AfwContext.getContext();
		
		String view = this.view;
		
		try {
			ExceptionProcessor processor = exceptionProcessorResover.resolve(view);
			
			if (null != processor) {
				// 交给处理器进行处理
				processor.process(context, ex);
			}
		} catch (Exception e) {
			logger.error(e.getMessage(), e);
		}
		
		// 生成默认的ModelAndView返回
		return new ModelAndView("");
	}

	/**
	 * @version 2015年12月4日-下午12:08:54
	 */
	public void setView(String view) {
		this.view = view;
	}

	/**
	 * @version 2015年12月4日-下午12:08:54
	 */
	public void setExceptionProcessorResover(Resolver<ExceptionProcessor> exceptionProcessorResover) {
		this.exceptionProcessorResover = exceptionProcessorResover;
	}
}